package com.um.pasantiaum.objetos;

import java.util.ArrayList;
import java.util.List;

import android.util.Log;

import com.parse.GetCallback;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;
import com.parse.ParseUser;

public class ProductoManager {

	private ArrayList<Producto> mProductos;
	private static ProductoManager sProductoManager;
	private static ParseUser sCurrentUser;

	public static ProductoManager getProductoManager(ParseUser currentUser) {
		if (sProductoManager == null || !currentUser.equals(sCurrentUser))
			sProductoManager = new ProductoManager(currentUser);
		return sProductoManager;
	}

	private ProductoManager(ParseUser currentUser) {

		mProductos = new ArrayList<Producto>();
		sCurrentUser = currentUser;

		ParseQuery<ParseObject> query = ParseQuery.getQuery("UserProductos");
		query.whereEqualTo("usuario", sCurrentUser);
		query.whereEqualTo("isInStock", true);
		
		try {
			List<ParseObject> objects = query.find();
			
			for (ParseObject po : objects)
				mProductos.add(new Producto(po));
		} catch (ParseException e1) {
			Log.d("Productos", "Error: " + e1.getMessage());
		}
	}

	public void addProducto(Producto p) {
		if (p != null) {
			ParseObject aux = new ParseObject("UserProductos");
			aux.put("usuario", sCurrentUser);
			aux.put("isInStock", true);
			aux.put("nombreProducto", p.getNombre());
			aux.put("precioProducto", p.getPrice());
			aux.put("descripcion", p.getDescripcion());

			try {
				aux.save();
				p.setObjectId(aux.getObjectId());
				mProductos.add(p);

				// aux.refresh();

			} catch (ParseException e) {
				Log.d("Productos", "Error: " + e.getMessage());
			}
		}
	}

	public void removeProducto(Producto p) {
		if (p != null) {
			ParseQuery<ParseObject> query = ParseQuery
					.getQuery("UserProductos");
			query.getInBackground(p.getObjectId(),
					new GetCallback<ParseObject>() {

						@Override
						public void done(ParseObject object, ParseException e) {
							if (e == null) {
								object.put("isInStock", false);
								object.saveInBackground();

							} else {
								Log.d("Productos", "Error: " + e.getMessage());
							}

						}
					});
			mProductos.remove(p);
		}
	}

	public void updateProducto(Producto p) {
		if (p != null) {
			ParseQuery<ParseObject> query = ParseQuery
					.getQuery("UserProductos");
			try {
				ParseObject aux = query.get(p.getObjectId());
				aux.put("nombreProducto", p.getNombre());
				aux.put("precioProducto", p.getPrice());
				aux.put("descripcion", p.getDescripcion());
				aux.saveInBackground();
				mProductos.remove(getProducto(p.getObjectId()));
				mProductos.add(new Producto(aux));
				
			} catch (ParseException e) {
				Log.d("Productos", "Error: " + e.getMessage());
			}

		}
	}
	
	public Producto getProducto(String id){
		for (Producto p : mProductos)
			if(p.getObjectId().equals(id))
				return p;
		return null;
	}

	public ArrayList<Producto> getProductos() {
		return mProductos;
	}

	
}
